package com.xueyi.workflow.util;

import com.xueyi.workflow.domain.dto.GraphSchema;

/**
 * BPMN XML 生成器抽象基类
 * 支持不同的流程设计器数据格式
 * 
 * @author xueyi
 */
public abstract class AbstractBpmnGenerator {
    
    /**
     * 从标准 GraphSchema 生成 BPMN XML
     * 
     * @param schema 标准的 GraphSchema 数据
     * @param processId 流程ID
     * @param processName 流程名称
     * @return BPMN XML 字符串
     */
    public abstract String generateBpmnXml(GraphSchema schema, String processId, String processName);
    
    /**
     * 从原始数据生成 BPMN XML
     * 子类需要实现具体的数据解析逻辑
     * 
     * @param rawData 原始数据（可能是 JSON 字符串、Map 等）
     * @param processId 流程ID
     * @param processName 流程名称
     * @return BPMN XML 字符串
     */
    public abstract String generateBpmnXmlFromRawData(Object rawData, String processId, String processName);
    
    /**
     * 检查是否支持指定的数据格式
     * 
     * @param rawData 原始数据
     * @return 是否支持
     */
    public abstract boolean supports(Object rawData);
    
    /**
     * 将原始数据转换为标准的 GraphSchema
     * 
     * @param rawData 原始数据
     * @return 标准的 GraphSchema
     */
    public abstract GraphSchema convertToGraphSchema(Object rawData);
    
    /**
     * 生成 BPMN XML 的通用方法
     * 优先使用标准 GraphSchema，如果不支持则使用原始数据
     * 
     * @param data 数据（可以是 GraphSchema 或原始数据）
     * @param processId 流程ID
     * @param processName 流程名称
     * @return BPMN XML 字符串
     */
    public String generateBpmnXml(Object data, String processId, String processName) {
        if (data instanceof GraphSchema) {
            // 如果已经是标准的 GraphSchema，直接使用
            return generateBpmnXml((GraphSchema) data, processId, processName);
        } else if (supports(data)) {
            // 如果支持原始数据格式，使用原始数据生成
            return generateBpmnXmlFromRawData(data, processId, processName);
        } else {
            // 尝试转换为标准 GraphSchema
            try {
                GraphSchema schema = convertToGraphSchema(data);
                return generateBpmnXml(schema, processId, processName);
            } catch (Exception e) {
                throw new RuntimeException("无法处理数据格式: " + data.getClass().getSimpleName(), e);
            }
        }
    }
}
